/**
 * 总共 13 个独特的符号
 * 用来确定罗马数字的规则是：对于罗马数字从左到右的每一位，选择尽可能大的符号值。
 * 对于 140，最大可以选择的符号值为 C=100
 * 接下来，对于剩余的数字 40，最大可以选择的符号值为
 * XL=40。因此，140的对应的罗马数字为 C+XL=CXL
 *
 *
 * 根据罗马数字的唯一表示法，为了表示一个给定的整数 num
 * 我们寻找不超过 num的最大符号值
 * 将 num 减去该符号值，然后继续寻找不超过 num 的最大符号值
 * 将该符号拼接在上一个找到的符号之后，循环直至 num 为 000。
 * 最后得到的字符串即为 num 的罗马数字表示
 *
 * @param {*} num
 */
var intToRoman = function (num) {
  const valueSymbols = [
    [1000, "M"],
    [900, "CM"],
    [500, "D"],
    [400, "CD"],
    [100, "C"],
    [90, "XC"],
    [50, "L"],
    [40, "XL"],
    [10, "X"],
    [9, "IX"],
    [5, "V"],
    [4, "IV"],
    [1, "I"],
  ]
  const roman = []
  for (const [value, symbol] of valueSymbols) {
    while (num >= value) {
      num -= value
      roman.push(symbol)
    }
    if (num == 0) {
      break
    }
  }
  return roman.join("")
}

/**
 * 硬编码
 * @param {*} num
 * @returns
 */
var intToRoman1 = function (num) {
  const thousands = ["", "M", "MM", "MMM"]
  const hundreds = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"]
  const tens = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"]
  const ones = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]

  const roman = []
  roman.push(thousands[Math.floor(num / 1000)])
  roman.push(hundreds[Math.floor((num % 1000) / 100)])
  roman.push(tens[Math.floor((num % 100) / 10)])
  roman.push(ones[num % 10])
  return roman.join("")
}

export { intToRoman, intToRoman1 }
